
#ifndef FORM_MAIN_H
#define FORM_MAIN_H

#include "form_qst.h"
#include "info.h"

namespace Ui {
class form_Main;
}

class form_Main : public QMainWindow {
    Q_OBJECT

public:
    explicit form_Main(QWidget* parent = nullptr);
    ~form_Main();


    loginInfo           lginfo;                         /**< 登录的用户信息 */
    setting             set;                            /**< 设置信息 */
    int                 connected;                      /**< 标记是否已经链接 */
    int                 drawn;                          /**< 标记是否已经绘画 */
    int                 painted;                        /**< 标记是否要PAINT */
private slots:/**< 槽函数 */

    void onClick_tableDel();                            /**< 点击：学生管理 -- 删除 */
    void onClick_tableIns();                            /**< 点击：学生管理 -- 插入 */
    void onSelect_tablecsvCombo(int);                   /**< 选中：学生管理 -- 记录组合框 */

    void save_liststu();                                /**< 保存学生链表 */

    void get_save_grd(QString &htmlf,QString &csvf);    /**< 见form_qst.h 接收作答信号 */
    void get_qsted_closed();                            /**< 见form_qst.h 接收关闭信号 */

    //静态控件=============================================================================================================================================================

    void on_but_qst_new_clicked();                                  /**< 点击：录题 -- 新建 */

    void on_but_qst_open_clicked();                                 /**< 点击：录题 -- 打开 */

    void on_txt_qst_find_textChanged(const QString &arg1);          /**< 做题：查找框修改 */

    void on_tree_doqst_itemDoubleClicked(QTreeWidgetItem *item, int column); /**< 做题：双击文件路径 */

    void on_txt_qst_path_editingFinished();                         /**< 结束修改：录题 -- 文件路径框 */

    void on_spin_stu_rowspp_valueChanged(int arg1);                 /**< 学生管理：每页行数更改 */

    void on_spin_stu_page_valueChanged(int arg1);                   /**< 学生管理：当前页数更改 */

    void on_but_stu_page_pre_clicked();                             /**< 学生管理：上一页 */

    void on_but_stu_page_next_clicked();                            /**< 学生管理：下一页 */

    void on_but_stus_page_home_clicked();                           /**< 学生管理：首页 */

    void on_but_stu_page_last_2_clicked();                          /**< 学生管理：尾页 */

    void on_table_stus_cellChanged(int row, int column);            /**< 学生管理：单元格修改 */

    void on_cbo_stus_find_currentTextChanged(const QString &arg1);  /**< 学生管理：查找修改 */

    void on_txt_stus_find_textChanged(const QString &arg1);         /**< 学生管理：查找文本修改 */

    void on_but_stus_findctrl_clicked();                            /**< 学生管理：查找控制 点击 */

    void on_but_stus_findnext_clicked();                            /**< 学生管理：查找下一个 点击 */

    void on_cbo_stus_sort_currentIndexChanged(int index);           /**< 学生管理：类别组合框索引值修改 */

    void on_but_stus_addfind_clicked();                             /**< 学生管理：继续筛选 */

    void on_but_stus_opendef_clicked();                             /**< 学生管理：用系统方式打开 */

    void on_txt_stat_find_textChanged(const QString &arg1);         /**< 统计：查找文本修改 */

    void on_but_stat_find_clicked();                                /**< 暂不用 */

    void on_but_stat_update_clicked();                              /**< 统计：刷新统计数据 */

    void on_table_stus_cellActivated(int row, int column);

    void on_table_stus_cellEntered(int row, int column);

private:
    Ui::form_Main *ui;                                  /**< 指代自己这个窗口界面 */

    void     drawMe();                                  /**< 窗口的绘制 */
    void     connectAll();                              /**< 控件的链接 */
    void     setup_ini(setting* st);                    /**< 配置窗口 */



    int      read_stu_line(std::string rowstr,student* reciv,int alert);                                    /**< 学生管理--根据一行文件内容分析赋值给学生指针 */
    int      read_students_stu(node** head,node** tail);                                                    /**< 学生管理--读学生文件 然后变为链表装入程序 */
    void     query_students_stu(node** head,node** tail);                                                   /**< 学生管理--在链表中查询 结果是链表 */
    void     tablestu_insEmptyLine(int i,QPushButton** insBut,QPushButton** delBut,
                               QComboBox** recCBox,int able);                                               /**< 学生管理--插入空行 */
    void     list_toTable_stu(node* head,node* tail,int n);                                                 /**< 学生管理--将链表显示到表格上 */
    void     list_toTable_stu(node* head,node* tail,int row,int page);                                      /**< 学生管理--将链表分页显示到表格上 */
    void     list_toFile_stu(FILE* fp,node* head,node* tail);                                               /**< 学生管理--将链表内容写入文件之中 */
    void     table_resize_stu(node* head,node* tail);                                                       /**< 学生管理--根据行，页进行表的重载 */
    int      calc_listn_row(int row);                                                                       /**< 学生管理--从在表中的第几行推算出在链表中的第几个 */
    node*    findstu_ID(node* head,node* tail,long long finderid);                                          /**< 学生管理--根据ID找学生节点 */
    node*    findstu_row(node* head,node* tail,int row);                                                    /**< 学生管理--根据当前表行数找学生节点 */
    void     replacestu_rc(student* stud,int row,int column,bool alert = 1);                                /**< 学生管理--把学生数据更新成表格中的数据 */
    int      liststu_suitable(student* stud,const QString& tt,const QString& arg1);                         /**< 学生管理--判断学生信息是否符合筛选条件 */
    int      liststu_suitable(student* stud);                                                               /**< 学生管理--默认时 采用ui上的数据 */
    int      liststu_find(node* srchead,node* srctail,node** newhead,node** newtail,int notf);              /**< 学生管理--根据链表筛选 */
    void     liststu_copy(node* srchead,node* srctail,node** newhead,node** newtail);                       /**< 学生管理--复制链表 */

    void     init_stat();                                                                                   /**< 成绩统计--统计表初始化 */
    void     addtosta_maj(char* maj);                                                                       /**< 成绩统计--专业名散列 */
    void     addtosta(char* maj,int cls,int yrs);                                                           /**< 成绩统计--表头散列 */
    void     statstu_update();                                                                              /**< 成绩统计--统计各群体数据 */

    Form_qst fqst;                                                                                          /**< 做题 + 题目编辑器窗口 */
    void     invaildpath_doqst();                                                                           /**< 做题页--文件夹路径有误 */
    void     displayfile_doqst();                                                                           /**< 做题页--展示文件夹下文件并设置控件 */

    int      findStrByRoot(QTreeWidgetItem* root,QString txt);                                              /**< 从根节点开始查找与txt相等的文字的节点索引 */

    int      bOk1;                                                                                          /**< 是否在继续筛选 */
    QString  getclsname(char* maj,int cls,int yrs);                                                         /**< 获得班级完整名称 */
    int      hashtable_maj[MAJINDEXMAX];                                                                    /**< 专业 土制散列表 */
    int      hashtable_cls[ALLCLASSMAX];                                                                    /**< 班级全称 */
    int      hta_yrs[YEARINDEXMAX];

    QList<QTreeWidgetItem*> tree_findres;                                                                   /**< 查找列表 */
    int                 tree_stat_findit;

    node*               liststu_head;                   /**< 学生链表头 */
    node*               liststu_tail;                   /**< 学生链表尾 */
    int                 liststu_n;                      /**< 链表节点个数 */
    int                 tablestu_page;                  /**< 学生表页数 */

    node*               liststu_head_find;              /**< 筛选学生链表头 */
    node*               liststu_tail_find;              /**< 筛选学生链表尾 */
    int                 liststu_n_find;                 /**< 筛选链表节点个数 */

    node*               liststu_head_ff;                /**< 继续筛选学生链表头 */
    node*               liststu_tail_ff;                /**< 继续筛选学生链表尾 */
    int                 liststu_n_ff;                   /**< 继续筛选链表节点个数 */

    node*               liststu_findnext;               /**< 查找下一个所用节点 */
    int                 liststu_findmove;               /**< 移动到了哪个位置 */

    node*               liststu_head_sort;              /**< 排序已经显示出的链表 头节点 */
    node*               liststu_tail_sort;              /**< 尾节点 */
    int                 liststu_n_sort;                 /**< 长度 */
protected:
    void showEvent(QShowEvent* qse);                    /**< 显示回调 */
    void closeEvent(QCloseEvent* qce);                  /**< 窗体关闭 */
};

#endif // FORM_MAIN_H
